#pragma once
#include "../core.h"

namespace qb {
namespace base {
// MemoryPage可能有不同长度的,单个MemoryPage必须能容纳bytes
// MemoryPage不能是等长的
// 但是MemoryPage都是按照4kb对齐的,大小都是4kb的整数倍
class MemoryPage;
class CentralAllocator;
class MemoryPageList;
class S_CORE_EXPORT PageAllocator {
  // 此类只用在单独线程中,不考虑多线程问题
 public:
  typedef void* RootPtrType;

 protected:
  friend class CentralAllocator;
  RootPtrType m_root;  // 是否有拥有者
  bool m_inmsg;        // 仅做调试用,true表示m_root位于Message内
  bool m_force_free;   //
  MemoryPageList* m_pagelist;   // 历史内存页面
  MemoryPage* m_current;        // 当前的内存页
  CentralAllocator* m_central;  // 仅仅用于调试查看
  double m_alloc_time;          //
 protected:
  PageAllocator(RootPtrType root, bool inMessage);
  ~PageAllocator();

 public:
  static PageAllocator* CreateWithRoot(RootPtrType root, bool inMessage);
  static void Destroy(PageAllocator* allocator);
  static void SwapRoot(PageAllocator* dest, PageAllocator* source);

  const RootPtrType GetRoot() const { return m_root; }
  bool IsInMessage() const { return m_inmsg; }
  int GetBytes() const;

  void* AllocMemory(int bytes);
};
}  // namespace base
}  // namespace qb